Computer programming refers to the process of writing and testing of computer programs. Computer programs are groups of instructions specified in one or more programming languages that describe actions to be performed by a computer or other processor-based device. When a computer program is loaded and executed on computer hardware, the computer will behave in a predetermined manner by following the instructions of the computer program. Accordingly, the computer becomes a specialized machine that performs the tasks prescribed by the instructions.
Increasingly, computer programming or coding is shifting away from single devices and toward distributed systems. Client/server architectures of the past have reemerged as a dominant computing paradigm thanks to advances in network communication as well the advent of the Internet. Moreover, development is moving toward software as a service. Here, applications are designed as network accessible services. More specifically, functionality that transcends a single application, and could thus be reused, is factored into services. Instead of implementing this functionality in their applications, developers consume these services thereby enabling them to focus on unique aspects.
Service code executes in environments different from ones where consumer code execute. Typically, the hardware capabilities differ sharply. Services run on enterprise-class hardware optimized to serve large numbers of consumers. In contrast, consumers run on a wide range of hardware with capabilities far below what is available on the service side. The platforms also differ. The services and service consumers could run on platforms subject to very different design goals. For example, a service could run on a redundant, multi-processor host running server software, while a service consumer could execute on a battery-powered phone running a web browser. The segregation of service code has had a strong impact on how it is designed, developed, and tested.
Service failures are typically caused by software defects and communication failures. Consequently, as in other distributed systems, end-to-end testing encompasses the service provider code as well as the communication between service consumers and a service provider.